package cn.fanyc.action.mq.kafka.producer.entry;

import java.io.Serializable;

/**
 * 交互实体对象
 * @author Fanyc
 * @date 2020-06-29 13:48
 */
public class RestDomain <E> implements Serializable {

    /**
     * 应用ID
     */
    private String appId;

    /**
     * 返回结果码
     */
    private String code;

    /**
     * 返回数据对象
     */
    private E data;

    /**
     * 返回具体消息，供开发人员调试代码，查看错误，正式环境应该被tips替换
     */
    private String msg;

    /**
     * 返回提示信息，供终端用户查看，国际化的返回编码
     */
    private String tips;

    /**
     * 消息签名
     */
    private String sign;

    @Override
    public String toString() {
        return "ReturnT [code=" + this.code + ", msg=" + this.msg + ", data=" + this.data + "]";
    }

    /**
     * 构造函数
     *
     * @param code    错误码
     * @param data    数据对象
     * @param msg 开发调试信息
     * @param tips    用户错误提示消息
     */
    public RestDomain(String code, E data, String msg, String tips) {
        this.code = code;
        this.data = data;
        this.msg = msg;
        this.tips = tips;
    }

    /**
     * 构造函数
     *
     * @param code 错误码
     * @param data 数据对象
     * @param tips 用户错误提示消息
     */
    public RestDomain(String code, E data, String tips) {
        this.code = code;
        this.data = data;
        this.msg = tips;
        this.tips = tips;
    }

    /**
     * 构造函数
     *
     * @param code 错误码
     * @param tips 用户错误提示消息
     */
    public RestDomain(String code, String tips) {
        this.code = code;
        this.data = null;
        this.msg = tips;
        this.tips = tips;
    }

    /**
     * 是否成功
     * @return 是否成功
     */
    public boolean isSuccess() {
        return RestCode.CODE200.code.equals(this.code);
    }

    /**
     * 成功对象
     *
     * @return 结果对象
     */
    public static RestDomain success() {
        return new RestDomain(RestCode.CODE200.code, null, RestCode.CODE200.msg, RestCode.CODE200.tips);
    }

    /**
     * 成功对象
     *
     * @param data 数据对象
     * @param <T>  任意可序列化对象
     * @return 结果对象
     */
    public static <T> RestDomain<T> success(T data) {
        return new RestDomain<>(RestCode.CODE200.code, data, RestCode.CODE200.msg, RestCode.CODE200.tips);
    }

    /**
     * 失败对象
     *
     * @param code 通用失败码
     * @return 结果对象
     */
    @SuppressWarnings({"unchecked"})
    public static RestDomain error(RestCode code) {
        return new RestDomain(code.code, null, code.msg, code.tips);
    }

    /**
     * 失败对象
     *
     * @param tips 错误信息
     * @return 结果对象
     */
    public static RestDomain error(String tips) {
        return new RestDomain(RestCode.CODE500.code, tips);
    }

    /**
     * 获取appId
     *
     * @return 返回appId
     */
    public String getAppId() {
        return appId;
    }

    /**
     * 设置appId的值
     *
     * @param appId 要设置的值
     */
    public void setAppId(String appId) {
        this.appId = appId;
    }

    /**
     * 获取code
     *
     * @return 返回code
     */
    public String getCode() {
        return code;
    }

    /**
     * 设置code的值
     *
     * @param code 要设置的值
     */
    public void setCode(String code) {
        this.code = code;
    }

    /**
     * 获取data
     *
     * @return 返回data
     */
    public E getData() {
        return data;
    }

    /**
     * 设置data的值
     *
     * @param data 要设置的值
     */
    public void setData(E data) {
        this.data = data;
    }

    /**
     * 获取msg
     *
     * @return 返回msg
     */
    public String getMsg() {
        return msg;
    }

    /**
     * 设置msg的值
     *
     * @param msg 要设置的值
     */
    public void setMsg(String msg) {
        this.msg = msg;
    }

    /**
     * 获取tips
     *
     * @return 返回tips
     */
    public String getTips() {
        return tips;
    }

    /**
     * 设置tips的值
     *
     * @param tips 要设置的值
     */
    public void setTips(String tips) {
        this.tips = tips;
    }

    /**
     * 获取sign
     *
     * @return 返回sign
     */
    public String getSign() {
        return sign;
    }

    /**
     * 设置sign的值
     *
     * @param sign 要设置的值
     */
    public void setSign(String sign) {
        this.sign = sign;
    }

    /**
     * 常用错误码枚举
     */
    public enum RestCode {
        /**
         * 500-系统异常
         */
        CODE500("500", "系统异常", "软件错误"),
        /**
         * 406-手机接口不兼容
         */
        CODE406("406", "接口不兼容", "当前客户端版本已过时，请升级"),
        /**
         * 404-接口不存在
         */
        CODE404("404", "接口不存在", "软件错误"),
        /**
         * 402-参数错误
         */
        CODE402("402", "输入参数不合法", "参数错误"),
        /**
         * 401-未登录
         */
        CODE401("401", "用户未授权", "请登录"),
        /**
         * 200-成功
         */
        CODE200("200", "成功", "成功");

        /**
         * 编码
         */
        public final String code;

        /**
         * 消息
         */
        public final String msg;

        /**
         * 用户提示信息
         */
        public final String tips;

        private RestCode(String code, String msg, String tips) {
            this.code = code;
            this.msg = msg;
            this.tips = tips;
        }

    }

}
